#include "utilspp.hpp"

#include <array>
#include <cstdio>
#include <memory>
#include <stdexcept>
#include <string>
#include <vector>
#include <algorithm>
#include <cctype>
#include <regex>

std::string UtilsPP::formatString(const char* format, ...) {
    va_list args;
    va_start(args, format);

    va_list args_copy;
    va_copy(args_copy, args);
    int length = std::vsnprintf(nullptr, 0, format, args_copy);
    va_end(args_copy);

    std::vector<char> buffer(length + 1);
    std::vsnprintf(buffer.data(), buffer.size(), format, args);
    va_end(args);

    return std::string(buffer.data());
}

std::string UtilsPP::exec(const char* cmd, bool runInBackground) 
{
     std::array<char, 128> buffer;
    std::string result;

    std::string command(cmd);
    if (runInBackground) {
        command += " &";
    }

    std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(command.c_str(), "r"), pclose);
    if (!pipe) {
        throw std::runtime_error("popen() failed!");
    }

    while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
        result += buffer.data();
    }
    return result;
}

bool UtilsPP::isValidString(const std::string& str) 
{
    // 检查字符串中的每个字符是否都是字母、数字、下划线或横杠
    return std::all_of(str.begin(), str.end(), [](unsigned char c) {
        // 使用C++标准库中的字符分类函数
        return std::isalnum(c) || c == '_' || c == '-';
    });
}

bool UtilsPP::isValidMediaUrl(const std::string& url) {
    std::cout<<"url:["<<url<<"]"<<std::endl;
    std::regex media_url_regex(
        R"(^(http|https|rtsp|rtmp)://)", // 只匹配URL开头部分
        std::regex_constants::icase     // 忽略大小写
    );
    return std::regex_search(url, media_url_regex);
}